package secondAchieve

import "log"

type a func()
type b func(int) string

type A interface {
	doA()
	doB(int) string
}

type E struct {
	a a
	b b
}

func (e *E) doA() {
	e.a()
}

func (e *E) doB(s int) string {
	return e.b(s)
}

func NewEA(a func()) *E {
	return &E{
		a: a,
	}
}

func NewEB(b func(int) string) *E {
	return &E{
		b: b,
	}
}

type C struct {
}

func Ca() {

}

func Cb(i int) string {
	return "C"
}

type D struct {
}

func Da() {

}

func Db(i int) string {
	return "D"
}

type F struct {
	A A
}

func do() {
	f := &F{
		A: NewEB(Cb),
	}
	log.Print(f.A.doB(2))
	log.Print(NewEB(Db).doB(1))
}
